//一个数组中只有两个数字是出现一次，其他所有数字都出现了两次。
//编写一个函数找出这两个只出现一次的数字。
//例如：
//有数组的元素是：1，2，3，4，5，1，2，3，4，6
//只有5和6只出现1次，要找出5和6.

#include <stdio.h>

int main()
{
	int arr[] = { 1,2,4,1,4,3,12,3};
	int n = sizeof(arr) / sizeof(arr[0]);
	
	int median = 0;
	for (int i = 0;i < n;++i) {
		median ^= arr[i];
	}
	//此时 median = e1 ^ e2;  二进制位相反的地方二进制位为 1//符合交换律，相同的异或没了
	int carry = 0;

	while ((median & (1 << carry)) == 0) {//找到两数二进制中不同的一位
		++carry;
	}
	int e1 = 0;
	int e2 = 0;
	for (int i = 0;i < n;++i) {
		if (arr[i] & (1 << carry)) {//利用不同的一位将其区分开，其他相同两数必定走同一分支而相互消除掉
			e1 ^= arr[i];
		}
		else {
			e2 ^= arr[i];
		}
	}

	printf("different num :%d,%d\n",e1,e2);

	return 0;
}